package com.alibaba.org.service.impl;

import com.alibaba.basic.service.impl.BaseServiceImpl;
import com.alibaba.org.domain.Dept;
import com.alibaba.org.mapper.DeptMapper;
import com.alibaba.org.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class DeptServiceImpl extends BaseServiceImpl<Dept> implements DeptService {
    // 注入

    @Autowired
    private DeptMapper deptMapper;

    @Override
    public List<Dept> deptTreeQuery() {
        // 先把所有部门数据查询出来
        List<Dept> depts = deptMapper.findAll();
        // 先创建一个map,部门所有数据放到里面，根据parent_id来寻找部门，就不用每次都去调数据库
        Map<Long,Dept> map = new HashMap<>();
        for (Dept dept : depts) {
            map.put(dept.getId(),dept);
        }

        /*
            定义数据哪来装整个部门结构，由于实体类中Dept存在下级部门对象children，
            可以直接装顶级部门，再由顶级部门去接收下级部门
         */
        List<Dept> deptTree = new ArrayList<>();
        // 判断dept是否存在partent_id;
        for (Dept dept : depts) {
            if (dept.getParent_id() == null){
                deptTree.add(dept);
            } else {
                // 找到有上级部门的部门id
                Long parent_id = dept.getParent_id();
                // 根据部门的上级部门id从map中找到上级部门的对象
                Dept parentDept = map.get(parent_id);

                // 再将该部门放到上级部门中getChildren获取上级部门中的部门对象
                List<Dept> children = parentDept.getChildren();
                children.add(dept);

            }
        }
        return deptTree;
    }
}
